#!/usr/bin/env python
#-*- coding:utf-8 -*
#
# Kontrolcu
#  - LibKontrolcu icin konsol uygulaması
#
# Geliştiriciler:
#  - Osman KARAGÖZ <osmank3@gmail.com>
#  - Taha Doğan Güneş <tdgunes@gmail.com>
# Belgelendirici:
#  - Okan Okuroğulları <ookurogullari@gmail.com>
#
# Web Sitesi: http://code.google.com/p/kontrolcu
# Lisansı: GPL v3 ile lisanslanmıştır.
#
# Yardım dökümanlarını http://code.google.com/p/kontrolcu/w/list 
#                                     adresinden bulabilirsiniz.
_surum = "1.5"

import sys, hashlib, os
try:
    import libkontrolcu
except:
    print "libkontrolcu modülü bulunamadı!"
veri = []
sonveri = []
dosliste = sys.argv
dosliste.pop(0)#ilk argüman yazılımın adı ve listeden çıkarılır :D

def kontroltipi():
    global kontip, KonTipUzan
    if "md5" in dosliste:
        kontip=hashlib.md5
        KonTipUzan = ".md5sum"
        dosliste.pop(dosliste.index("md5"))#md5 listeden çıkarılıyor
    elif "sha1" in dosliste:
        kontip=hashlib.sha1
        KonTipUzan = ".sha1sum"
        dosliste.pop(dosliste.index("sha1"))#sha1 listeden çıkarılıyor
    elif "sha224" in dosliste:
        kontip=hashlib.sha224
        KonTipUzan = ".sha224sum"
        dosliste.pop(dosliste.index("sha224"))#sha224 listeden çıkarılıyor
    elif "sha256" in dosliste:
        kontip=hashlib.sha256
        KonTipUzan = ".sha256sum"
        dosliste.pop(dosliste.index("sha256"))#sha256 listeden çıkarılıyor
    elif "sha384" in dosliste:
        kontip=hashlib.sha384
        KonTipUzan = ".sha384sum"
        dosliste.pop(dosliste.index("sha384"))#sha384 listeden çıkarılıyor
    elif "sha512" in dosliste:
        kontip=hashlib.sha512
        KonTipUzan = ".sha512sum"
        dosliste.pop(dosliste.index("sha512"))#sha512 listeden çıkarılıyor


def toplamalma(liste, yaz=True):
    global ciktiliste
    ciktiliste=[]
    sonuc=[]
    for n in liste:
        try:
            libkontrolcu.toplamver(kontip, n) #toplamları isteme
            sonuc.append(libkontrolcu.toplam)
        except IOError:
            sonuc.append("Dosya bulunamadı:")
        except MemoryError:
            sonuc.append("Geçici belleğe sığmıyor:")
    for n in range(len(sonuc)):
        cikti = sonuc[n] + "  " + liste[n].split("/")[-1]
        if yaz == True:
            print cikti
        if sonuc[n] == "Geçici belleğe sığmıyor:":
            pass
        else:
            ciktiliste.append(cikti)

def dosyakayit(liste):
    if len(ciktiliste) == 1:
        dosyadi = liste[0].split("/")[-1]
        dosya = dosyadi + KonTipUzan
        try:
            kayit = open(dosya, "w")
            kayit.write(ciktiliste[0])
            kayit.write("\n")
            print dosya, "başarıyla kaydedildi."
        except IOError, (hata_no, hata):
            if hata_no == 13:
                print "Dosya Kaydedilemedi! Yazma izninizi kontrol edin!"
    if len(ciktiliste) > 1:
        soru = raw_input("Kayıt için dosya adı giriniz : ")
        dosya = soru + KonTipUzan
        try:
            kayit = open(dosya, "w")
            for i in ciktiliste:
                kayit.write(i)
                kayit.write("\n")
            print dosya, "başarıyla kaydedildi."
        except IOError, (hata_no, hata):
            if hata_no == 13:
                print "Dosya Kaydedilemedi! Yazma izninizi kontrol edin!"

def num():
    a=os.listdir("./")
    a.sort()
    n=1
    numara={}
    for dosya in a:
        if os.path.isfile(dosya) == 1:
            numara[n] = dosya
            print n, "->", numara[n]
            n += 1
        else:
            pass
    secilen=raw_input("Seçtiklerinizi aralarında boşluk bırakarak yazın:\n")
    listesec=secilen.split()
    global liste
    liste=[]
    for m in listesec:
        try:
            liste.append(numara[int(m)])
        except KeyError:
            print "Listeden sayı seçmelisiniz."
            exit()

def numaralandirma():
        if "--help" in dosliste or "--yardim" in dosliste:
            print "--Yardım--\nEkranda listelenen dosyalara, başlarında bulunan numaralardan\nulaşmak için kullanılan komut\n\nKullanım:\n  kontrolcu numaralandir [kont. tip]\n  kontrolcu numaralandir [kont. tip] kaydet\n  kontrolcu numaralandir kontrol\n  kontrolcu numaralandir --yardim\n\nKomutlar:\n  Parametresiz kullanım kontrol toplamlarını ekrana yazar.(ilk kullanım)\n  'save'      'kaydet'    -> Kontrol toplamlarını dosyaya yazar.\n  'check'     'kontrol'   -> Kontrol toplamı dosyalarından kontrol yapar.\n                             'İnternet üzerindeki kontrol toplamı\n                             dosyalarını da okuyabilir.'\n  '--help'    '--yardim'  -> Ekrana bu yazıyı döker."
            exit()

        elif "save" in dosliste or "kaydet" in dosliste:
            try:
                dosliste.pop(dosliste.index("save"))
            except:
                dosliste.pop(dosliste.index("kaydet"))
            num()
            toplamalma(liste, False)
            dosyakayit(liste)

        elif "check" in dosliste or "kontrol" in dosliste:
            try:
                dosliste.pop(dosliste.index("check"))
            except:
                dosliste.pop(dosliste.index("kontrol"))
            num()
            liste.append(os.getcwd())
            kontrolet(liste)

        else:
            num()
            toplamalma(liste)

def kontrolet(liste):
    if liste[0][:5] == "http:" or liste[0][:4] == "ftp:" or liste[0][:6] == "https:":
        if len(liste) == 1:
            yol = raw_input("Dosyanın bulunduğu yolu girin (Bu dizin için ./ kullanın): ")
            liste.append(yol)
        else:
            pass
    try:
        libkontrolcu.check(liste)
        if len(libkontrolcu.hatadurum) > 0:
            if 001 in libkontrolcu.hatadurum:
                print "Adresteki dosya, kontrol toplamı dosyası değil!"
            elif 002 in libkontrolcu.hatadurum:
                print "Kontrol toplamı dosyası hatalı!"
            elif 003 in libkontrolcu.hatadurum:
                print libkontrolcu.hatadurum[libkontrolcu.hatadurum.index(003)+1], " dosyası bulunamıyor."
            elif 004 in libkontrolcu.hatadurum:
                print libkontrolcu.hatadurum[libkontrolcu.hatadurum.index(004)+1], " dosyası geçici belleğe sığmıyor."
        elif len(libkontrolcu.hatadurum) == 0:
            n=0
            while len(libkontrolcu.sondurum) > n:
                if libkontrolcu.sondurum[n] == True:
                    print libkontrolcu.sondurum[n+1] + " eskisi ile uyuşuyor"
                elif libkontrolcu.sondurum[n] == False:
                    print libkontrolcu.sondurum[n+1] + " değişmiş."
                n += 2
    except IOError, (hata_no, hata):
        if hata_no == 2:
            print "%s dosyası bulunamıyor!"% liste[0]
        if hata_no == "socket error":
            print "Adres bulunamıyor!"

def saglamayap(liste):
    n=0
    while len(liste) > n:
        try:
            libkontrolcu.ccheck(liste[n], liste[n+1])
            n += 2
        except IOError, (hata_no, hata):
            if hata_no == 2:
                print "Dosya %s bulunamadı."% liste[n]
                exit()
        except MemoryError:
            print "Dosya %s geçici belleğe sığmıyor."% liste[n]
    if len(libkontrolcu.hatadurum) > 0:
        if 011 in libkontrolcu.hatadurum:
            print "Kontrol toplamı hatalı!"
    elif len(libkontrolcu.hatadurum) == 0:
        n=0
        while len(libkontrolcu.sondurum) > n:
            if libkontrolcu.sondurum[n] == True:
                print libkontrolcu.sondurum[n+1] + " eskisi ile uyuşuyor"
            elif libkontrolcu.sondurum[n] == False:
                print libkontrolcu.sondurum[n+1] + " değişmiş."
            n += 2

try:
    if "--gui=qt" in dosliste:
        import kontrolcuQt
        kontrolcuQt.konqt()
    
    elif "--gui=tk" in dosliste:
        import kontrolcuTk
        kontrolcuTk.kontk()
    
    else:
    #kontrol toplam seçimi
        kontroltipi()

        if "enumeration" in dosliste or "numaralandir" in dosliste:
            try:
                dosliste.pop(dosliste.index("numaralandir"))#sadece kontrol tipi ve seçenekler kalsın
            except:
                dosliste.pop(dosliste.index("enumeration"))#sadece kontrol tipi ve seçenekler kalsın
            numaralandirma()

        elif "--help" in dosliste or "--yardim" in dosliste:
            print "---------------------   Yardım   ---------------------\nKontrolcu, dosyaların kontrol toplamlarını alan bir programdır.\n\nKullanım:\n  kontrolcu --gui=[arayüz]\n  kontrolcu [kont. tip] [dosya] [dosya] ...\n  kontrolcu [kont. tip] kaydet [dosya] [dosya] ...\n  kontrolcu sagla [dosya] [kont. top.] [dosya] [kont. top.] ...\n  kontrolcu kontrol [kontrol_dosyası]\n  kontrolcu numaralandir --yardim\n  kontrolcu --yardim\n  kontrolcu --surum\n\nArayüz:\n  qt     -> Qt4 arayüz\n  tk     -> Tkinter arayüz\n\nKomutlar:\n  Parametresiz kullanım kontrol toplamlarını ekrana yazar.(ilk kullanım)\n  'save'        'kaydet'       -> Kontrol toplamlarını dosyaya yazar.\n  'ccheck'      'sagla'        -> Verilen dosya ile verilen kontrol toplamını\n                                  karşılaştırır.\n  'check'       'kontrol'      -> Kontrol toplamı dosyalarından kontrol yapar.\n                                  'İnternet üzerindeki kontrol toplamı\n                                  dosyalarını da okuyabilir.'\n  'enumeration' 'numaralandir' -> Dosya listesini numaralandırarak kolay\n                                  seçim yapılmasını sağlar.\n  '--help'      '--yardim'     -> Ekrana bu yazıyı döker.\n  '--version'   '--surum'      -> Sürüm hakkında bilgiler içerir.\n"
            exit()
        elif "--version" in dosliste or "--surum" in dosliste:
            print "Sürüm: %s"% _surum
            exit()

        elif "save" in dosliste or "kaydet" in dosliste:
            try:
                dosliste.pop(dosliste.index("save")) #"save" siliniyor
            except:
                dosliste.pop(dosliste.index("kaydet")) #"kaydet" siliniyor
            toplamalma(dosliste, False) #toplam elde ediliyor.
            dosyakayit(dosliste)

        elif "check" in dosliste or "kontrol" in dosliste:
            try:
                dosliste.pop(dosliste.index("check"))
            except:
                dosliste.pop(dosliste.index("kontrol"))
            kontrolet(dosliste)

        elif "ccheck" in dosliste or "sagla" in dosliste:
            try:
                dosliste.pop(dosliste.index("ccheck"))
            except:
                dosliste.pop(dosliste.index("sagla"))
            saglamayap(dosliste)

        else:#verilenlerin toplamlarını yazar
            toplamalma(dosliste)

except NameError:
    print "Kontrol tipini yazın!"
else:
    if len(dosliste)==0:
        print "Genel yardım için '--yardim' kullanın."
